package com.itany.corejava.code07_常用类.内部类;

/**
 * @author MissChen
 * @date 2024年03月04日 9:16
 */
public class Test02_局部内部类 {
    public static void main(String[] args) {
        MyOuter outer=new MyOuter();
        outer.show();
    }
}
class MyOuter{
    private String name="admin";
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    public void test(){
        System.out.println("--------这是外部类的test方法------------");
    }
    public void show(){
        System.out.println("----这是show方法----");
        String gender="男";
        //局部内部类，也称之为方法内部类，是定义在外部类方法中的类
        class MyInner{
            private String name="alice";
            private String phone="13589654578";

            public String getName() {
                return name;
            }

            public void setName(String name) {
                this.name = name;
            }

            public String getPhone() {
                return phone;
            }

            public void setPhone(String phone) {
                this.phone = phone;
            }
            private void test(){
                System.out.println("这是局部内部类private修饰的方法");
            }
            public void print(){
                System.out.println("*******这是局部内部类的方法*********");
                System.out.println("这是局部内部类public修饰的方法");

                // 当内部类访问所在方法(show方法)的属性时, 只能访问final修饰的属性
                // JDK8 之前, 如果属性没有被final 修饰, 则内部类无法访问。如果访问则报错
                // JDK8 开始, 如果属性没有被final 修饰,内部类可以访问, 默认自动为属性添加final
                // 但是此时如果外部对属性进行了修改, 则不会添加final ,内部类访问则报错
                // 即: 此时不能修改对应属性的值
                System.out.println(gender);
                // gender="女";//报错


                //也可以访问内部类的成员
                System.out.println(phone);

                //也可以访问外部类的成员
                System.out.println(age);

                //当内部类与外部类存在同名属性时候，默认访问的是内部类的属性
                System.out.println(name);
                System.out.println("=================");

                //如果想要访问外部类属性
                System.out.println(MyOuter.this.name);
                MyOuter outer=new MyOuter();
                System.out.println(outer.name);
                System.out.println("****");
                test();
                MyOuter.this.test();

            }
        }

        //局部内部类是定义在方法中的, 因此只能在内部类所在的方法中进行实例化
        MyInner inner=new MyInner();
        inner.print();
        //MyOuter类的属性name
        System.out.println(name);
        //局部内部类的属性name
        System.out.println(inner.name);
        inner.test();



    }
}
